use agent::generic::{create_agent, ProviderConfig};
use common::compose::make_empty_ctx;
use dotenvy::dotenv;
use std::env;
use std::time::Duration;
use tokio::time::timeout;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 加载环境变量
    dotenv().ok();
    
    // 检查 Gemini API 密钥
    if env::var("GEMINI_API_KEY").is_err() {
        println!("错误: 请设置 GEMINI_API_KEY 环境变量");
        return Ok(());
    }
    
    // 获取 API 密钥和基础 URL
    let api_key = env::var("GEMINI_API_KEY").unwrap();
    let base_url = env::var("GEMINI_BASE_URL").ok();
    
    println!("环境变量检查:");
    println!("  GEMINI_API_KEY: {} (长度: {})", if api_key.is_empty() { "为空" } else { "已设置且不为空" }, api_key.len());
    println!("  GEMINI_BASE_URL: {}", base_url.as_deref().unwrap_or("未设置（将使用默认URL）"));
    
    println!("\n创建 Gemini 配置...");
    
    // 创建 Gemini 配置
    let provider_config = ProviderConfig::Gemini {
        api_key,
        base_url,
        temperature: 0.3,
        max_tokens: None,
    };
    
    println!("创建 Gemini 代理...");
    
    // 创建一个简单的代理，使用 Gemini 模型
    let agent = create_agent(
        provider_config,
        "gemini-2.5-pro-exp-03-25", // 使用 Gemini 模型
        "你是一个简单的助手。请用一句话回答问题。"
    );
    
    println!("代理创建成功，发送测试请求...");
    
    // 简单的测试问题
    let question = "你好，请做个简单的自我介绍。";
    println!("问题: {}", question);
    println!("正在发送请求到 Gemini API...");
    
    // 使用代理回答问题，添加超时处理
    let result = timeout(
        Duration::from_secs(30), // 30秒超时
        agent.run(question.to_string(), make_empty_ctx())
    ).await;
    
    match result {
        Ok(response) => {
            match response {
                Ok(answer) => {
                    println!("成功收到回答!");
                    println!("回答: {}", answer);
                },
                Err(e) => {
                    println!("API错误: {}", e);
                    println!("错误类型: {:?}", std::any::type_name_of_val(&e));
                    println!("\n提示: 请检查您的API密钥是否正确，以及是否有权限访问Gemini API。");
                }
            }
        },
        Err(_) => {
            println!("请求超时！请检查您的网络连接和API端点配置。");
            println!("\n提示: 如果您在中国大陆，可能需要设置代理或使用其他API端点。");
        }
    }
    
    println!("\n测试完成！");
    
    Ok(())
}
